package br.edu.ufcg.unknown.semantico.arvore;

import br.edu.ufcg.unknown.lexico.Token;
import br.edu.ufcg.unknown.semantico.Tipo;

public class Nodo {

	private Tipo tipo;

	public Nodo dir;

	public Nodo esq;

	public boolean ehFolha;

	public Nodo(Token tk) {
		this(tk, false);
	}
	
	public Nodo(Token tk, boolean folha) {
		this.tipo = new Tipo(tk);
		this.ehFolha = folha;
	}

	public Tipo getTipo() {
		return tipo;
	}

	public void setTipo(Tipo tipo) {
		this.tipo = tipo;
	}

	public Nodo getFilhoDireita() {
		return dir;
	}

	public void setFilhoDireita(Nodo filhoDireita) {
		this.dir = filhoDireita;
	}

	public Nodo getFilhoEsquerda() {
		return esq;
	}

	public void setFilhoEsquerda(Nodo filhoEsquerda) {
		this.esq = filhoEsquerda;
	}

	public boolean ehFolha() {
		return this.ehFolha;
	}

	public boolean equals(Object obj) {

		Nodo nodo = (Nodo) obj;

		if(nodo == null){
			return false;
		}
		
		if (this.tipo != null && nodo.tipo != null) {
			if (!this.tipo.equals(nodo.tipo)) {
				return false;
			}
		} else if (this.tipo != null || nodo.tipo != null) {
			return false;
		}

		if (this.esq != null && nodo.esq != null) {
			if (!this.esq.equals(nodo.esq)) {
				return false;
			}
		} else if (this.esq != null || nodo.esq != null) {
			return false;
		}

		if (this.dir != null && nodo.dir != null) {
			if (!this.dir.equals(nodo.dir)) {
				return false;
			}
		} else if (this.dir != null || nodo.dir != null) {
			return false;
		}

		return true;

	}
	
}
